/**
 * 服务端通过命名管道将本地文件拷贝到客户端
 * 先打开命名管道，再打开需要被拷贝的文件，将文件通过命名管道发送给另一个程序
 * 
 */

#include "commod.hpp"

int main()
{
    //创建命名管道
    if(mkfifo(pipePath,md) == -1)
    {
        perror("mkfifo");
        exit(1);
    }
    //打开管道
    int fd = open(pipePath,O_WRONLY);
    if(fd == -1)
    {
        perror("open");
        exit(1);
    }
    //打开需要被拷贝的文件
    FILE* fp = fopen(filePath,"r");
    if(fp == nullptr)
    {
        perror("fread");
        exit(1);
    }
    //将文件传给管道
    char buf[SIZE];
    size_t bytes = 0;
    while(true)
    {
        size_t n = fread(buf,1,sizeof(buf),fp);
        if(n>0)
        {
            //写入管道
            ssize_t sst = write(fd,buf,n);
            if(sst == -1)
            {
                perror("write");
                close(fd);
                fclose(fp);
                exit(1);
            }
            bytes+=n;
        }
        // 检查是否到达文件末尾或出错
        if (n < sizeof(buf)) {
            if (feof(fp)) {
                break; // 文件读取完毕
            }
            if (ferror(fp)) {
                perror("fread");
                fclose(fp);
                close(fd);
                exit(1);
            }
        }
    }
    std::cout<<"传递字节数"<<bytes<<std::endl;
    fclose(fp);
    close(fd);
    
    return 0;
}
